package cn.tedu.csmall.product.service.impl;

import cn.tedu.csmall.product.ex.ServiceCode;
import cn.tedu.csmall.product.ex.ServiceException;
import cn.tedu.csmall.product.mapper.AlbumMapper;
import cn.tedu.csmall.product.mapper.PictureMapper;
import cn.tedu.csmall.product.mapper.SpuMapper;
import cn.tedu.csmall.product.pojo.dto.AlbumAddNewDTO;
import cn.tedu.csmall.product.pojo.dto.AlbumUpdateDTO;
import cn.tedu.csmall.product.pojo.entity.Album;
import cn.tedu.csmall.product.pojo.vo.AlbumStandardVO;
import cn.tedu.csmall.product.service.IAlbumService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Slf4j
public class AlbumServiceImpl implements IAlbumService {

    @Autowired
    AlbumMapper mapper;
    @Autowired
    PictureMapper pictureMapper;
    @Autowired
    SpuMapper spuMapper;

    /**
     * 添加一条相册数据
     * @param albumAddNewDTO
     */
    @Override
    public void addNew(AlbumAddNewDTO albumAddNewDTO) {
        int num=mapper.countByName(albumAddNewDTO.getName());
        if(num>0){
            String message="添加相册失败，相册【"+albumAddNewDTO.getName()+"】已存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT,message);
        }
        Album album=new Album();
        BeanUtils.copyProperties(albumAddNewDTO,album);
        log.debug("准备添加相册【{}】",albumAddNewDTO.getName());
        int rows=mapper.insert(album);
        if(rows!=1){
            String message="添加相册失败，系统繁忙，请稍后重试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_INSERT,message);
        }
    }

    /**
     * 根据id删除一条相册数据
     * @param id
     */
    @Override
    public void delete(Long id) {
        //根据id获取相册VO类对象
        AlbumStandardVO albumStandardVO = mapper.getAlbumStandardVO(id);
        //如果对象为null抛出异常
        if(albumStandardVO==null){
            String message="删除相册失败，该相册不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        //根据相册id查询该相册与照片表和spu表是否存在关联关系
        if(pictureMapper.countByAlbumId(id)>0||spuMapper.countByAlbumId(id)>0){
            String message="删除相册失败，该相册与picture表或spu表存在关联关系！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT,message);
        }
        log.debug("准备删除相册数据！");
        int rows=mapper.deleteById(id);
        //如果受影响行数不等于1
        if(rows!=1){
            String message="删除相册失败，系统异常，请稍后重试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_DELETE,message);
        }
        log.debug("删除相册成功！");
    }

    /**
     * 根据id修改相册基本信息
     * @param albumUpdateDTO
     */
    @Override
    public void update(Long id,AlbumUpdateDTO albumUpdateDTO) {
        //获取被修改数据的id
        //根据id获取VO对象
        AlbumStandardVO albumStandardVO = mapper.getAlbumStandardVO(id);
        //如果获取到的对象为null
        if(albumStandardVO==null){
            //数据不存在，抛出异常
            String message="修改相册失败，该相册不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        //创建相册对象
        //把DTO对象复制到相册对象中
        Album album=new Album();
        BeanUtils.copyProperties(albumUpdateDTO,album);
        album.setId(id);
        int rows = mapper.updateById(album);
        //如果受影响行数不等于1抛出异常
        if(rows!=1){
            String message="修改相册失败，系统繁忙，请稍后重试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE,message);
        }
        log.debug("相册数据修改成功！");
    }

    /**
     * 根据id获取相册详情
     * @param id 需要查询的数据的id
     * @return
     */
    @Override
    public AlbumStandardVO getAlbumStandardVO(Long id) {
        log.debug("开始出来【根据id获取相册详情】请求");
        AlbumStandardVO album = mapper.getAlbumStandardVO(id);
        if(album==null){
            String message="获取相册详情失败，尝试访问的数据不存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        return album;
    }

    /**
     * 获取相册列表
     * @return
     */
    @Override
    public List<AlbumStandardVO> list() {
        log.debug("开始测试获取相册列表的请求");
        return mapper.list();
    }


}
